AWS Config のマネージドルールをもとにしたルールを AWS CDK で作成する

AWS Config のマネージドルールをもとにしたルールを AWS CDK で作成する

Clock Icon2025.01.05

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS Config では マネージドルール という一般的なセキュリティのプラクティスをあらかじめ定義したルールをテンプレートとして利用可能です。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/evaluate-config_use-managed-rules.html

今回は AWS Config のマネージドルールをもとにしたルールを AWS CDK で作成してみました。

試してみた

CDK 実装

AWS CDK で AWS Config マネージドルールを作成するには、aws-cdk-lib/aws-config モジュールを使用します。また AWS Config マネージドルールの作成は、ManagedRule コンストラクトを使用します。

下記は IAM ユーザーの MFA 有効化を検証するマネージドルール(IAM_USER_MFA_ENABLED)を作成する例です。

lib/main-stack.ts
import * as config from 'aws-cdk-lib/aws-config';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new config.ManagedRule(this, 'IAMUserMfaEnabled', {
      // マネージドルールの識別子
      identifier: config.ManagedRuleIdentifiers.IAM_USER_MFA_ENABLED,

      // ルールの評価に使用されるパラメータ
      inputParameters: {},

      // 評価モード。デフォルトは DETECTIVE のみ
      evaluationModes: config.EvaluationMode.DETECTIVE,

      // 実行頻度。デフォルトは24時間
      maximumExecutionFrequency: config.MaximumExecutionFrequency.TWELVE_HOURS,
    });
  }
}

identifier では ManagedRuleIdentifiers クラスで提供されている定数を使用して、マネージドルールを識別子で指定する必須プロパティです。

現在 AWS Config で利用可能なマネージドルールは、ドキュメントによると 467 件となっています。

https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html

しかし現在 ManagedRuleIdentifiers クラスで指定可能なルールは node_modules/aws-cdk-lib/aws-config/lib/rule.d.ts を確認すると 293 件 となっており、全てのルールが利用可能というわけではありません。L1 コンストラクトを別途使用する必要があります。

inputParameters では、ルールの評価に使用されるパラメータを指定します。このプロパティはルールに応じて指定する必要があります。IAM_USER_MFA_ENABLED ルールにはパラメーターが無いため今回は指定する必要がありませんでした。

evaluationModes ではルールの評価モードを指定します。検知タイミングがリソースの変更後となる DETECTIVE と変更前となる PROACTIVE の2つがありますが、マネージドルールによってはサポートされていないものがあります。IAM_USER_MFA_ENABLED ルールは DETECTIVE のみサポートしています。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/evaluate-config-rules.html

maximumExecutionFrequency ではルールによる評価の最大実行頻度を指定します。デフォルトは 24 時間で、1 時間、3 時間、6 時間、12 時間、24 時間のいずれかを指定できます。

前述の CDK 実装をデプロイします。

デプロイされた CloudFormation スタックをマネジメントコンソールから確認すると、以下のようにリソース一覧に AWS Config ルールが追加されていることが確認できます。

CloudFormation のコンソールではルールへのリンクが無かったので、AWS Config のコンソールから探してアクセスします。

作成されたルールです。スクショを撮り忘れましたがルール作成直後は Resources in scope には何も表示されておらず、後述の IAM User を作成した上で Re-Evaluate(再評価)を実行すると表示されるようになりました。

作成したのは下記の IAM User です。上記ではコンソールアクセスで MFA を無効化しており、それにより非準拠(Noncompliant)のリソースとして検知されています。ちなみに MFA を無効化 -> ルールでの再評価を実行してから Resources in scope に表示されるまで 20 分近く掛かりました。

一覧からリソースにアクセスするとリソースの詳細が表示されます。同じリソースタイプ(今回は IAM User)で評価対象となっている各ルールでどのような評価がされているか等が確認できます。

サポートされない評価モードを有効化した場合

前述の通り Config ルールの評価モードはマネージドルールによってはサポートされていないものがあります。下記のように IAM_USER_MFA_ENABLED ルールでサポートされていない評価モードの有効化を試してみます。

lib/main-stack.ts
import * as config from 'aws-cdk-lib/aws-config';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new config.ManagedRule(this, 'IAMUserMfaEnabled', {
      // マネージドルールの識別子
      identifier: config.ManagedRuleIdentifiers.IAM_USER_MFA_ENABLED,

      // ルールの評価に使用されるパラメータ
      inputParameters: {},

      // 評価モード。デフォルトは DETECTIVE のみ
      evaluationModes: config.EvaluationMode.DETECTIVE_AND_PROACTIVE, // サポートされない評価モードを指定

      // 実行頻度。デフォルトは24時間
      maximumExecutionFrequency: config.MaximumExecutionFrequency.TWELVE_HOURS,
    });
  }
}

デプロイ時に The AWS Config rule you are enabling does not support the specified evaluation modes. Confirm the evaluation modes for the rule are valid and try again. エラーとなりました。

$ npm run deploy Main

> cdk_sample_app@0.1.0 deploy
> cdk deploy --require-approval never --method=direct Main

✨  Synthesis time: 5.58s

Main: start: Building 4c758a453e50e3ef3edaa1bfc7ce3c753ce116ca8ad9bb300f6db518e3ca5e37:current_account-current_region
Main: success: Built 4c758a453e50e3ef3edaa1bfc7ce3c753ce116ca8ad9bb300f6db518e3ca5e37:current_account-current_region
Main: start: Publishing 4c758a453e50e3ef3edaa1bfc7ce3c753ce116ca8ad9bb300f6db518e3ca5e37:current_account-current_region
Main: success: Published 4c758a453e50e3ef3edaa1bfc7ce3c753ce116ca8ad9bb300f6db518e3ca5e37:current_account-current_region
Main: deploying... [1/1]
Main: updating stack...
Main |   0 | 5:28:33 PM | UPDATE_IN_PROGRESS   | AWS::CloudFormation::Stack | Main User Initiated
Main |   0 | 5:28:36 PM | UPDATE_IN_PROGRESS   | AWS::Config::ConfigRule | IAMUserMfaEnabled (IAMUserMfaEnabled0E20E42C)
  0 Currently in progress: Main, IAMUserMfaEnabled0E20E42C
Main |   0 | 5:30:58 PM | UPDATE_FAILED        | AWS::Config::ConfigRule | IAMUserMfaEnabled (IAMUserMfaEnabled0E20E42C) The AWS Config rule you are enabling does not support the specified evaluation modes. Confirm the evaluation modes for the rule are valid and try again. (Service: Config, Status Code: 400, Request ID: 9c9d0c9b-9244-4e65-b651-f58c8b2a6899)
Main |   0 | 5:30:58 PM | UPDATE_ROLLBACK_IN_P | AWS::CloudFormation::Stack | Main The following resource(s) failed to update: [IAMUserMfaEnabled0E20E42C].
Main |   0 | 5:31:01 PM | UPDATE_IN_PROGRESS   | AWS::Config::ConfigRule | IAMUserMfaEnabled (IAMUserMfaEnabled0E20E42C)
Main |   1 | 5:31:02 PM | UPDATE_COMPLETE      | AWS::Config::ConfigRule | IAMUserMfaEnabled (IAMUserMfaEnabled0E20E42C)
Main |   2 | 5:31:02 PM | UPDATE_ROLLBACK_COMP | AWS::CloudFormation::Stack | Main
Main |   3 | 5:31:03 PM | UPDATE_ROLLBACK_COMP | AWS::CloudFormation::Stack | Main

Failed resources:
Main | 5:30:58 PM | UPDATE_FAILED        | AWS::Config::ConfigRule | IAMUserMfaEnabled (IAMUserMfaEnabled0E20E42C) The AWS Config rule you are enabling does not support the specified evaluation modes. Confirm the evaluation modes for the rule are valid and try again. (Service: Config, Status Code: 400, Request ID: 9c9d0c9b-9244-4e65-b651-f58c8b2a6899)
❌  Main failed: Error: The stack named Main failed to deploy: UPDATE_ROLLBACK_COMPLETE: The AWS Config rule you are enabling does not support the specified evaluation modes. Confirm the evaluation modes for the rule are valid and try again. (Service: Config, Status Code: 400, Request ID: 9c9d0c9b-9244-4e65-b651-f58c8b2a6899)

TypeScript の静的解析や CDK Synth 時にはエラーとならないので注意しましょう。

おわりに

AWS Config のマネージドルールをもとにしたルールを AWS CDK で作成してみました。

AWS Config ルールの運用は AWS Security Hub のベストプラクティス基準にお任せすることも多いと思いますが、今回のように個別にルールを作成したりカスタマイズしたりすることも可能です。

他にもリソースのコンプライアンス更新時の通知や、AWS Lambda 関数を使用したカスタムルールも aws-cdk-lib/aws-config を使用して実装可能なので追って試したいと思います。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.